const Koa=require("koa");
const path=require("path");
const logger=require("koa-logger");//产生日志记录
const onerror=require("koa-onerror");//错误链接和转换显示功能
const serve=require("koa-static");
const router=require("./router");
const render=require("koa-art-template");
const koaBody=require("koa-body");
const session=require("koa-session");


const app=new Koa();
app.use(logger());//日志：记录开发中所有的操作流程，当开发出现错误时候，可以快速完成定位以及触发错误的源头和执行过程
onerror(app);//错误显示转换
/* 
静态资源中间件(图片、视频、css、js...)，不需要服务器进行处理可以直接访问的资源
    koa-static中间件可以在koa请求进行处理时候，判断浏览器访问的相关资源在对应的静态资源目录中是否存在
    如果不存在则直接调用next函数访问下一个中间件
    koa-static中间件在定义时候，需要制定一个项目目录作为静态资源的存放目录
    koa-static静态资源的存放目录，从项目结构上来说，可以认为是服务器的根目录 */

// app.use(serve("./public/"));
let staticPath=path.join(__dirname,"./public/");
app.use(serve(staticPath));

app.keys=["itany-koa"];
const CONFIG = {
    key: 'sessionId', //cookies中的key的属性名
    
    maxAge: 86400000,//cookie记录的数据有效期，默认值为1天，单位是ms
};

/* 
session(config,koa实例对象)
config是session构建的相关配置，需要使用koa实例对象，且koa实例对象必须提供一个字符串，不然session无法生效
该中间件会自行判断项目是否需要使用session空间功能，如果需要会提供session空间的id，否则不提供
koa-session中间件会在ctx的综合对象提供session属性对象，用于完成session空间操作 
*/

app.use(session(CONFIG, app));

/* 
当koa-art-template的render函数完成了初始化的中间件加载
此时在后续的中间件koa上下文对象ctx中，被自动装一个render函数
该函数就是集成了art-template模板引擎的渲染方法，使用语法和规则就是art-template函数的使用规则 */
render(app,{
    root: path.join(__dirname, './views/'),//统一设置art-template读取的模板文件路径
    extname: '.html',//统一设置模板的扩展名称
    debug: true//开启调试模式
  });

app.use(koaBody({
    multipart:true,//支持文件上传
    formidable:{
        uploadDir:path.join(__dirname,"./public/upload"),//设置上传文件由二进制转换成文件后的服务器存放目录，文件存储时候会完成重新命名操作
        keepExtensions:true//设置保留上传文件类型的后缀，默认false
    }
}));

/* 
router是路由对象，用于提供定义时地址和回调函数之间的对应关系
router完成关系定义后，由router.routes()方法指向完成路由表的生成
    路由表->一段由js的路由和方法对应的判断逻辑 */
app.use(router.routes());

app.listen(3000);